#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/notifier.h>
#include <linux/delay.h>

// 定义一个简单的通知链
static BLOCKING_NOTIFIER_HEAD(my_notifier_chain);

// 发送通知的函数
void send_my_event(int data)
{
	blocking_notifier_call_chain(&my_notifier_chain, data, NULL);
}

// 通知链处理函数示例
static int my_notifier_callback(struct notifier_block *nb, unsigned long action,
				void *data)
{
	printk(KERN_INFO "Received event with data: %d\n", (int)data);
	return NOTIFY_OK;
}

// 注册通知链处理函数
static struct notifier_block my_notifier = {
	.notifier_call = my_notifier_callback,
};

static void test_notifier_chain(void)
{
	int count = 5;
	while (count > 0) {
		send_my_event(count);
		mdelay(2 * 1000);
		pr_info("notifier test count=%d\n", count);
		count--;
	}
}

static int __init my_module_init(void)
{
	// 把处理函数添加到通知链
	int ret = blocking_notifier_chain_register(&my_notifier_chain, &my_notifier);
	if (ret) {
		printk(KERN_ERR "Failed to register notifier\n");
		return ret;
	}
	test_notifier_chain();
	printk(KERN_INFO "Module initialized\n");
	return 0;
}

static void __exit my_module_exit(void)
{
	// 移除处理函数
	blocking_notifier_chain_unregister(&my_notifier_chain, &my_notifier);
	printk(KERN_INFO "Module exited\n");
}

module_init(my_module_init);
module_exit(my_module_exit);
MODULE_LICENSE("GPL");
